package pers.lolicer.redtidelibrary.utils

import android.graphics.Bitmap
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

fun String.sundayMatch(pattern: String): Boolean {
    val template = this

    val n = template.length
    val m = pattern.length

    // 边界条件检查
    if (m == 0) return true // 空模式串总是匹配
    if (n < m) return false // 模板串比模式串短，不可能匹配

    // 构建偏移表（记录每个字符在模式串中最后一次出现的位置）
    val offset = mutableMapOf<Char, Int>()
    for (i in pattern.indices) {
        offset[pattern[i]] = m - i // 记录字符到末尾的距离
    }

    var i = 0 // 模板串的当前匹配位置
    while (i <= n - m) {
        var j = 0 // 模式串的当前匹配位置

        // 逐个字符匹配
        while (j < m && template[i + j] == pattern[j]) {
            j++
        }

        // 如果完全匹配，返回 true
        if (j == m) {
            return true
        }

        // 根据偏移表跳过字符
        val nextChar = template.getOrNull(i + m) // 模板串中模式串末尾的下一个字符
        val skip = offset[nextChar] ?: (m + 1) // 如果字符不在偏移表中，跳过 m + 1 个字符
        i += skip
    }

    return false // 未找到匹配
}

fun Long.toDateStr(pattern: String = "yyyy-MM-dd HH:mm:ss:SSS", locale: Locale = Locale.getDefault()): String {
    // val date = System.currentTimeMillis() Long类型的时间戳
    val date = Date(this)
    val format = SimpleDateFormat(pattern, locale)
    return format.format(date)
}

fun Bitmap.trimToA4Size(): Bitmap{
    var bitmap = this
    val originalWidth = bitmap.width
    val originalHeight = bitmap.height
    var width = originalWidth
    var height = originalHeight

    val aspectRatio = originalHeight / originalWidth.toFloat()
    val a4Ratio = 297/210.toFloat()

    if(aspectRatio > a4Ratio){ // 较窄
        height = (originalHeight * (a4Ratio/aspectRatio)).toInt()
    }
    else if(aspectRatio < a4Ratio){ // 较宽
        width = (originalWidth * (aspectRatio/a4Ratio)).toInt()
    }
    // 裁剪
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height)
    // 缩放
    bitmap = Bitmap.createScaledBitmap(bitmap, 210, 297, true)

    return bitmap
}

// 从content uri获取数字标识符
fun String.getID():String{
    val res = this.substringAfterLast('/').substringAfterLast("%3A")
    return res
}